package es.wtestgen.action.inicio;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Properties;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionRedirect;

import es.wtestgen.action.WTestGenAction;
import es.wtestgen.bean.inicio.ProfesorForm;
import es.wtestgen.bean.profesor.AlumnoForm;
import es.wtestgen.domain.Alumno;
import es.wtestgen.domain.Profesor;
import es.wtestgen.services.AlumnoDAO;
import es.wtestgen.services.AsignaturaDAO;
import es.wtestgen.services.ProfesorDAO;
import es.wtestgen.util.DniDuplicadoException;
import es.wtestgen.util.NombreUsuaException;

public class MantenimientoProfesoresAction extends WTestGenAction {
	
	private static final Log log = LogFactory.getLog(MantenimientoProfesoresAction.class);

	@Override
	public ActionForward _execute(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response) throws NombreUsuaException, DniDuplicadoException  {

		log.info("_____Mantenimiento de profesores:::::");	
		String accion = request.getParameter("accion");
		ActionForward forward = null;
		
		if(accion == null || accion.equals("")){
			forward = listar(mapping, form, request, response);
		}else if(accion.equals("nuevo")){
			forward = nuevo(mapping, form, request, response);
		}else if(accion.equals("eliminar")){
			forward = eliminar(mapping, form, request, response);
		}else if(accion.equals("editar")){
			forward = editar(mapping, form, request, response);
		}else if(accion.equals("guardar")){
			forward = guardar(mapping, form, request, response);
		}else if(accion.equals("cambiarPasswordAdmin")){
			forward = cambiarPasswordAdmin(mapping, form, request, response);		
		}else if(accion.equals("guardarNuevaPassword")){
			forward = guardarNuevaPassword(mapping, form, request, response);			
		}
		return forward;
	}
	
	
	private ActionForward guardarNuevaPassword(ActionMapping mapping,
			ActionForm form, HttpServletRequest request,
			HttpServletResponse response) {
		
		boolean modificado = false;
		String pwdUsua = (String)request.getParameter("pwdUsua");
		String nuevaPwdUsua = (String)request.getParameter("nuevaPwdUsua");
		String confirmaPwdUsua = (String)request.getParameter("confirmaPwdUsua");
		
		ActionRedirect actionRedirect = null;
		
		String FICHERO_CONFIGURACION = request.getRealPath("WEB-INF/classes/administracion.properties");
		Properties propiedades;
		
		/* 
		 * Carga del fichero de propiedades
	     */
		
		try {  
		       FileInputStream f = new FileInputStream(FICHERO_CONFIGURACION);
		       propiedades = new Properties();
		       propiedades.load(f);
		       f.close();	       	

		
				if(pwdUsua != null && !"".equals(pwdUsua)){
					if(nuevaPwdUsua != null && !"".equals(nuevaPwdUsua)){
						if(confirmaPwdUsua != null && !"".equals(confirmaPwdUsua)){	
							if(nuevaPwdUsua.equals(confirmaPwdUsua)){
								/*
								 * Modificamos el valor de la password en el fichero properties 
								 */
								
								FileOutputStream out= null; 
								propiedades.setProperty("pwdUsua", nuevaPwdUsua);
								
								try {
						               out = new FileOutputStream(FICHERO_CONFIGURACION);
						               propiedades.store(out, "Usuarios/claves");
						           } catch (java.io.IOException e) {
						               e.printStackTrace();
						           } 
								
								
								
								modificado = true;
								
							}else{
								/*
								 * redirigimos a pagina de error por no ser iguales la password y la confirmación
								 */
								log.info("_______No se ha podido modificar la password del Administrador porque la password y su confirmación no son iguales");
								request.setAttribute("errorPwd", "No se ha podido modificar la password del Administrador porque la password y su confirmación no son iguales");
								return mapping.findForward("cambiarPasswordAdmin");							
							}
						}else{
							log.info("_______No se ha podido modificar la password del Administrador porque la confirmación de la password es nula o vacía");
							request.setAttribute("errorPwd", "No se ha podido modificar la password del Administrador porque la confirmación de la password es nula o vacía");
							return mapping.findForward("cambiarPasswordAdmin");							
						}				
					}else{
						log.info("_______No se ha podido modificar la password del Administrador porque la nueva password es nula o vacía");
						request.setAttribute("errorPwd", "No se ha podido modificar la password del Administrador porque la nueva password es nula o vacía");
						return mapping.findForward("cambiarPasswordAdmin");							
					}
				}else{
					log.info("_______No se ha podido modificar la password del Administrador porque la password actual es nula o vacía");
					request.setAttribute("errorPwd", "No se ha podido modificar la password del Administrador porque la password actual es nula o vacía");
					return mapping.findForward("cambiarPasswordAdmin");				
				}
				
		if(modificado){
			ActionForward findForward = mapping.findForward("passwordModificada");
			actionRedirect = new ActionRedirect(findForward);
			actionRedirect.addParameter("accion", "");
			actionRedirect.addParameter("passwordOk", "si");
			return actionRedirect;			
		}else{
			log.info("_______No se ha podido modificar la password del Administrador");
			return mapping.findForward("error");
		}
	}catch (Exception e) {
	       /* Manejo de excepciones
	        */
		log.info("_______No se ha podido modificar la password del Administrador se ha producido una excepción" , e);
		e.printStackTrace();
		return mapping.findForward("error");
     }
}


	private ActionForward cambiarPasswordAdmin(ActionMapping mapping,
			ActionForm form, HttpServletRequest request,
			HttpServletResponse response) {

		
		return mapping.findForward("cambiarPasswordAdmin");
	}


	private ActionForward verTodosAlumnos(ActionMapping mapping,
			ActionForm form, HttpServletRequest request,
			HttpServletResponse response) {
		
		AlumnoDAO alumnoDao = new AlumnoDAO();
		
		AlumnoForm alumnoForm = (AlumnoForm)form;
		
		List<Alumno> alumnos = alumnoDao.findAll();

		if(alumnos != null && alumnos.size()>0){
			alumnoForm.setAlumnos(alumnos);
		}else{
			alumnoForm.setAlumnos(new ArrayList<Alumno>());
		}
		request.setAttribute("alumnos", alumnoForm.getAlumnos());
		return mapping.findForward("verTodosAlumnos");
	}


	private ActionForward eliminarAlumnoDeAsignatura(ActionMapping mapping,
			ActionForm form, HttpServletRequest request,
			HttpServletResponse response) {
		AlumnoDAO alumnoDao = new AlumnoDAO();
		AlumnoForm alumnoForm = (AlumnoForm) form;
		
		String codAlum = request.getParameter("codAlum");
		String codAsig = (String)request.getParameter("codAsig");
		
		/*
		 * Con esta clase que hereda de ActionForward le podemos añadir parametros a las
		 * redirecciones forward
		 */
		ActionRedirect actionRedirect = null;
		
		if(alumnoDao.eliminarAlumnoDeAsignatura(Integer.parseInt(codAlum),Integer.parseInt(codAsig))){
			ActionForward findForward = mapping.findForward("eliminadoAlumno");
			actionRedirect = new ActionRedirect(findForward);
			actionRedirect.addParameter("accion", "");
			actionRedirect.addParameter("eliminadoOk", "si");
			actionRedirect.addParameter("codAsig", codAsig);
			return actionRedirect;			
		}else{
			return mapping.findForward("error");
		}
	}


	private ActionForward anadirAlumno(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response) {
		AlumnoDAO alumnoDao = new AlumnoDAO();
		
		AlumnoForm alumnoForm = (AlumnoForm) form;
		
		String codAlum = request.getParameter("codAlum");
		String codAsig = (String)request.getParameter("codAsig");
		
		Alumno alum = (Alumno)alumnoDao.findById(codAlum).get(0);
		/*
		 * Con esta clase que hereda de ActionForward le podemos añadir parametros a las
		 * redirecciones forward
		 */
		ActionRedirect actionRedirect = null;
		
		if(alumnoDao.guardarAlumnoExistenteEnAsignatura(alum, codAsig)){
			ActionForward findForward = mapping.findForward("guardadoAlumnoEnAsignatura");
			actionRedirect = new ActionRedirect(findForward);
			actionRedirect.addParameter("accion", "");
			actionRedirect.addParameter("guardadoOk", "si");
			actionRedirect.addParameter("codAsig", codAsig);
			return actionRedirect;			
		}else{
			return mapping.findForward("error");
		}
	}


	private ActionForward buscarAlumno(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response) {
		
		AlumnoDAO alumnoDao = new AlumnoDAO();
		AlumnoForm alumnoForm = (AlumnoForm)form;
		
		List<Alumno> alumnos = alumnoDao.findByParameters(alumnoForm);
		
		if(alumnos != null && alumnos.size()>0){
			alumnoForm.setAlumnos(alumnos);
		}else{
			alumnoForm.setAlumnos(new ArrayList<Alumno>());
		}
		request.setAttribute("alumnos", alumnoForm.getAlumnos());
		
		
		return mapping.findForward("buscarAlumno");
	}


	private ActionForward buscar(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response) {
		
		return mapping.findForward("buscarAlumno");
	}


	public ActionForward nuevo(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			 {
		
		ProfesorForm profesorForm = (ProfesorForm) form;
		Profesor profesor = new Profesor();
		
		request.setAttribute("profesor", profesor);
		return mapping.findForward("nuevoProfesor");
	}

	public ActionForward eliminar(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
	{
		ProfesorDAO profesorDao = new ProfesorDAO();
		
		ProfesorForm profesorForm = (ProfesorForm) form;
		
		String codProf = request.getParameter("codProf");
		
		/*
		 * Con esta clase que hereda de ActionForward le podemos anadir parametros a las
		 * redirecciones forward
		 */
		ActionRedirect actionRedirect = null;
		
		if(profesorDao.eliminar(Integer.parseInt(codProf)/*,Integer.parseInt(codAsig)*/)){
			ActionForward findForward = mapping.findForward("eliminadoProfesor");
			actionRedirect = new ActionRedirect(findForward);
			actionRedirect.addParameter("accion", "");
			actionRedirect.addParameter("eliminadoOk", "si");
			return actionRedirect;			
		}else{
			return mapping.findForward("error");
		}
	}
	
	public ActionForward editar(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
	{	
		ProfesorDAO profesorDao = new ProfesorDAO();
		
		ProfesorForm profesorForm = (ProfesorForm) form;
		
		String codProf = request.getParameter("codProf");
		
		List<Profesor> profesores = profesorDao.findById(codProf);		
		Profesor profesor = profesores.get(0);
		
		profesorForm.setApellidos(profesor.getApellidos());
		profesorForm.setNombre(profesor.getNombre());
		profesorForm.setNombreUsua(profesor.getNombreUsua());
		profesorForm.setCodProf(String.valueOf(profesor.getCodProf()));
		profesorForm.setDni(profesor.getDni());
		profesorForm.setEmail(profesor.getEmail());
		profesorForm.setTelefono(profesor.getTelefono());
		profesorForm.setPwdUsua(profesor.getPwdUsua());
		profesorForm.setConfirmPwdUsua(profesor.getPwdUsua());
		
		request.setAttribute("profesorForm", profesorForm);
		return mapping.findForward("nuevoProfesor");
	}
	
	public ActionForward guardar(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response) throws NombreUsuaException,DniDuplicadoException
	{
		ProfesorDAO profesorDao = new ProfesorDAO();
		AlumnoDAO alumnoDao = new AlumnoDAO();
		
		ProfesorForm profesorForm = (ProfesorForm) form;
		
		Profesor profesor = new Profesor();
		Alumno alumno = new Alumno();
		
		profesor.setNombre(profesorForm.getNombre());
		profesor.setApellidos(profesorForm.getApellidos());
		profesor.setDni(profesorForm.getDni());
		profesor.setEmail(profesorForm.getEmail());
		profesor.setTelefono(profesorForm.getTelefono());
		profesor.setNombreUsua(profesorForm.getNombreUsua());
		profesor.setPwdUsua(profesorForm.getPwdUsua());		
		if(profesorForm.getCodProf() != null && !profesorForm.getCodProf().equals("") && !profesorForm.getCodProf().equals("0")){
			int id = Integer.parseInt(profesorForm.getCodProf());
			profesor.setCodProf(id);
		}else{
			profesor.setCodProf(-1);
		}
		
		
		List<Profesor> profesores = (List<Profesor>)profesorDao.findAll();
		List<Alumno> alumnos = (List<Alumno>)alumnoDao.findAll();
		
		for (Iterator iterator = alumnos.iterator(); iterator.hasNext();) {
			Alumno al = (Alumno) iterator.next();
			if(al.getNombreUsua().equals(profesorForm.getNombreUsua()) && al.getPwdUsua().equals(profesorForm.getPwdUsua())){
				return mapping.findForward("errorUsuarioOPassword");
			}		
		}
		
		for (Iterator iterator2 = profesores.iterator(); iterator2.hasNext();) {
			Profesor prof = (Profesor) iterator2.next();
			
			if(prof.getNombreUsua().equals(profesorForm.getNombreUsua()) && prof.getPwdUsua().equals(profesorForm.getPwdUsua())){
				return mapping.findForward("errorUsuarioOPassword");
			}	
		}
		
		
		ActionRedirect actionRedirect = null;
		if(profesorDao.guardar(profesor)){			
			ActionForward findForward = mapping.findForward("guardadoProfesor");
			actionRedirect = new ActionRedirect(findForward);
			actionRedirect.addParameter("accion", "");
			actionRedirect.addParameter("guardadoOk", "si");
			return actionRedirect;			
		}else{
			return mapping.findForward("error");
		}
		
	}

	public ActionForward listar(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response){
		
		ActionForward forward = null;
		
		ProfesorDAO profesorDao = new ProfesorDAO();
		
		AsignaturaDAO asignaturaDao = new AsignaturaDAO();
		
		ProfesorForm profesorForm = (ProfesorForm)form;
		
		
		//String codAsig = request.getParameter("codAsig");

			
		List<Profesor> profesores = (List<Profesor>)profesorDao.findAll();		
		if(profesores != null && profesores.size()>0){
			profesorForm.setProfesores(profesores);
		}else{
			profesorForm.setProfesores(new ArrayList<Profesor>());
		}		
					
		forward = mapping.findForward("listarProfesores");
		
		request.setAttribute("profesores", profesorForm.getProfesores());
		return forward;
	}
	

}
